"""
难度：中等
给你一个数组，将数组中的元素向右轮转 k 个位置，其中 k 是非负数。
示例 1:
输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]
示例 2:
输入：nums = [-1,-100,3,99], k = 2
输出：[3,99,-1,-100]
解释: 
向右轮转 1 步: [99,-1,-100,3]
向右轮转 2 步: [3,99,-1,-100]
"""

"""
很容易想到的是用一个新数组，先保存原数组的后 k 个元素，再保存原数组的前 n-k 个元素。但题目要求不使用额外的数组空间，那么就需要在原数组上做操作。
我们可以先把整个数组翻转一下，这样后半段元素就到了前边，前半段元素就到了后边，只不过元素顺序是反着的。我们再从 k 位置分隔开，将 [0, k-1] 的元素和 [k, n-1] 的元素再翻转一下，就得到了最终结果。
具体步骤：
将数组 [0, n-1] 位置上的元素全部翻转
将数组 [0, k-1] 位置上的元素进行翻转
将数组 [k+1, n-1] 位置上的元素进行翻转

"""

from typing import List


class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        n = len(nums)
        k = k % n
        self.reverse(nums,0,n-1)
        self.reverse(nums,0,k-1)
        self.reverse(nums,k,n-1)

    def reverse(self,nums:List[int],left:int,right:int):
        while left < right:
            temp = nums[left]
            nums[left] = nums[right]
            nums[right] = temp
            left += 1
            right -= 1


    